package com.taotao.controller;

import com.codingapi.txlcn.tc.annotation.LcnTransaction;
import com.codingapi.txlcn.tracing.TracingConstants;
import com.codingapi.txlcn.tracing.TracingContext;
import com.taotao.dao.MayiktPayinfoDao;
import com.taotao.entity.MayiktIntegralInfo;
import com.taotao.entity.MayiktPayinfo;

import com.taotao.feign.IntegralServiceFeign;
import com.taotao.service.MayiktPayinfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.Base64Utils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;

/**
 * (MayiktPayinfo)表控制层
 *
 * @author makejava
 * @since 2022-01-23 21:08:27
 */
@RestController
@Slf4j
@RequestMapping("mayiktPayinfo")
public class MayiktPayinfoController {
    /**
     * 服务对象
     */
    @Resource
    private MayiktPayinfoService mayiktPayinfoService;
    @Autowired
    private MayiktPayinfoDao mayiktPayinfoDao;
    @Autowired
    private IntegralServiceFeign integralServiceFeign;

    @RequestMapping("/updatePaySuccess")
    @Transactional
    @LcnTransaction
    public ResponseEntity updatePaySuccess(Long payId) {
        // 1.先查询 该支付id 对应的数据是否存在
        // 2.如果存在的情况下 状态是为 未支付---
        int result = mayiktPayinfoDao.updatePaySuccess(payId);
        if (result <= 0) {
            return ResponseEntity.status(500).body("fail");
        }
        // 使用feign调用积分服务接口增加 积分。
        MayiktIntegralInfo integralDto = new MayiktIntegralInfo();
        integralDto.setValue(1000); // 积分的值1000
        integralDto.setUserId(123); // 123
        integralDto.setPayId(String.valueOf(payId)); // 支付的id
        //integralServiceFeign.index();
        ResponseEntity integralResult = integralServiceFeign.addIntegral(integralDto);
//        // 判断如果调用积分服务接口失败了， 则或回滚当前事务
        if ("500".equals(integralResult.getStatusCode())) {
            // 手动回滚当前事务
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResponseEntity.status(500).body("fail");
//
        }
        log.debug("tracing transmit group:{}", TracingContext.tracing().groupId());

        // 程序执行到 48行 调用完积分服务接口之后 -----积分服务事务提交了。积分服务 对应 积分数据库 积分表 是可以查询到 增加积分数据
        // 模拟代码报错   支付服务调用完积分服务接口之后 突然返回呢？
        if (payId == 1) {
            int j = 1 / 0;  // 支付服务事务回滚了，支付表中状态 未支付状态 但是 积分服务中 积分数据已经提交了。
            // 积分增加---查询到 显示未支付。--解决分布事务问题
        }
        return ResponseEntity.status(200).body("ok");
    }

    /**
     * 分页查询
     *
     * @param mayiktPayinfo 筛选条件
     * @param pageRequest   分页对象
     * @return 查询结果
     */
    @GetMapping
    public ResponseEntity<Page<MayiktPayinfo>> queryByPage(MayiktPayinfo mayiktPayinfo, PageRequest pageRequest) {
        return ResponseEntity.ok(this.mayiktPayinfoService.queryByPage(mayiktPayinfo, pageRequest));
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public ResponseEntity<MayiktPayinfo> queryById(@PathVariable("id") String id) {
        return ResponseEntity.ok(this.mayiktPayinfoService.queryById());
    }

    /**
     * 新增数据
     *
     * @param mayiktPayinfo 实体
     * @return 新增结果
     */
    @PostMapping
    public ResponseEntity<MayiktPayinfo> add(MayiktPayinfo mayiktPayinfo) {
        return ResponseEntity.ok(this.mayiktPayinfoService.insert(mayiktPayinfo));
    }

    /**
     * 编辑数据
     *
     * @param mayiktPayinfo 实体
     * @return 编辑结果
     */
    @PutMapping
    public ResponseEntity<MayiktPayinfo> edit(MayiktPayinfo mayiktPayinfo) {
        return ResponseEntity.ok(this.mayiktPayinfoService.update(mayiktPayinfo));
    }

    /**
     * 删除数据
     *
     * @param
     * @return 删除是否成功
     */
    @DeleteMapping
    public ResponseEntity<Boolean> deleteById() {
        return ResponseEntity.ok(this.mayiktPayinfoService.deleteById());
    }

}

